#define DEBUG_MODE 1

#include <time.h>
#include "soapH.h"
#include "messenger.nsmap"
#include <stdio.h>
int idUsuario = -1;

int menu1() {
	char opcion[50];
	int op;
	printf("******************************************\n");
	printf("*Bienvenido a imessenger:                *\n");
	printf("******************************************\n");
	printf("*(1)Iniciar session presciona            *\n");
	printf("*(2)Registrar Usuario en el sistema      *\n");
	printf("*(3) Dar de baja a usuario               *\n");
	printf("Elija la opcion que desee: \n");
	printf("******************************************\n");
	scanf(" %s", opcion);
	op = atoi(opcion);
	while (op > 4 || op < 0) {
		printf("\nOpcion incorrecta.\n");
		printf("Elija una opcion de 0 a 4:\n");
		scanf(" %s", opcion);
		op = atoi(opcion);
	}
	return op;
}

int menu2() {
	char opcion[50];
	int op;
	printf("**************************************************\n");
	printf("*(1)Enviar solicitudes de amistad entre usuarios *\n");
	printf("*(2)Aceptar/Rechazar solicitudes de amistad      *\n");
	printf("*(3)Enviar mensaje a un usuario del sistema      *\n");
	printf("*(4)Recibir mensaje a de usuarios del sistema    *\n");
	printf("*(5)Comprobar envio del mensaje (doubleCheck)    *\n");
	printf("*(6)Enviar fichero a un usuario del sistema      *\n");
	printf("*(7)Recibir fichero a de usuarios del sistema    *\n");
	printf("*(8)Usuarios Online                              *\n");
	printf("*(9)SALIR                                        *\n");
	printf("Elija la opcion que desee: \n");
	printf("**************************************************\n");
	scanf(" %s", opcion);
	op = atoi(opcion);
	while (op > 10 || op < 0) {
		printf("\nOpcion incorrecta.\n");
		printf("Elija una opcion de 0 a 9:\n");
		scanf(" %s", opcion);
		op = atoi(opcion);
	}
	return op;
}

int main(int argc, char **argv) {

	struct soap soap;
	char *serverURL;
	struct Usuario *nuevoUsuario;
	struct Usuario nuevoUsuarioLocal;
	struct ListaFriendShip *p = malloc(sizeof(struct ListaFriendShip));
	struct Usuario usuarioLocal;
	int id; //ID DEL USUARIO LOGUEADO
	int res, logOk=-11, a, userId, op1, op2;
	//recordar quitar
	char operation, numA, numB;
	// Init gSOAP environment
	soap_init(&soap);
	char user[20], edad[3];
	// Obtain server address
	//serverURL = argv[1];
	serverURL="http://localhost:8080";
	int val = 0;
	int sale = 0;
	int vacio;
	//MENU CONFIGURACION

	while (sale == 0) {
		op1 = menu1();
		res=0;
		id=0;
		if (op1 == 1) {
			printf("diga el nickname de usuario registrado\n");
			scanf("%s", user);
			int vacio;
			int respLlamadaLogin=0;
			printf("antes de la llamada a login\n");
			respLlamadaLogin=soap_call_ns__loggin(&soap, serverURL, "", user,&id ,&res);
			printf("vacio=%d\n", vacio);
			printf("res=%d\n", res);
			printf("id=%d\n", id);
			idUsuario = res;
			if (respLlamadaLogin == -1) {
				printf(
						"el usuario NO existe REGISTRESE O INTENTELO OTRA VEZ\n");
			} else {
				printf("ID=%d USUARIO REGISTRADO BIENVENIDO  \n",idUsuario);

				logOk = idUsuario;
			}
		}
		if (op1 == 2) {
			printf("diga el nickname del usuario\n");
			scanf("%s", user);
			printf("diga su edad \n");
			scanf("%s", edad);
			int age = atoi(edad);
			nuevoUsuarioLocal.edad = age;
			strcpy(nuevoUsuarioLocal.nickName, user);
			strcpy(usuarioLocal.nickName, user);

			soap_call_ns__altaUsr(&soap, serverURL, "", nuevoUsuarioLocal,
					&vacio, &res);
			if (res == -1) {
				printf("el usuario ya existe en la BBDD elija otro\n");
			} else if (res == 1) {
				printf("\n***USUARIO CREADO***\n");
			}

		}

		if (logOk >= 0) {
			while (sale == 0) {
				op2 = menu2();
				if (op2 == 1) {
					printf(
							"*(1)Enviar solicitudes de amistad entre usuarios *\n");
					printf(
							"*Diga el numero de usuario si no lo sabe opcion 8 ver usuarios *\n");
					scanf("%s", edad);
					int userId = atoi(edad);

					soap_call_ns__enviar_solicitudes(&soap, serverURL, "",
							userId, idUsuario, &res);

				}
				if (op2 == 2) {
					int i; //me traigo la lista de usuarios para actualizar los nombres
										p = malloc(sizeof(struct ListaFriendShip));
										soap_call_ns__getAllSOAPServices2(&soap, serverURL, " ", p);
					struct Usuario *usuarioReturn = malloc(sizeof(struct Usuario));
					printf("*(2)Aceptar/Rechazar solicitudes de amistad *\n");
					struct ListaFriendShip *listaSolicitudes = malloc(
							sizeof(struct ListaFriendShip));

					soap_call_ns__aceptar_Rechazar_solicitudes(&soap, serverURL,
							"",idUsuario, listaSolicitudes);


					printf("\nDE REGRESO EN EL METODO\n");

					for (i = 0; i < listaSolicitudes->iterador; i++) {
					if(listaSolicitudes->frienShip[i].sender!=idUsuario){
						printf("Usuario %d,%s  quiere ser tu amigo\n",
								listaSolicitudes->frienShip[i].sender,
								listaSolicitudes->frienShip[i].user);
						printf("Aceptar? (1)si || (2) no \n");
						scanf("%s", edad);
						int respuestaUser = atoi(edad);
						printf("User response= %d \n", respuestaUser);
						int userSoliciter =
								usuarioReturn->friendRequestList[i].sender;
						soap_call_ns__aceptar_RechazarFriend(&soap, serverURL,
								"", respuestaUser, idUsuario, userSoliciter,
								&res);
						if (res == 1)
							printf("Usuario Agregado!  \n");
						else if (res == 2)
							printf(
									"Usuario Eliminado de su lista de solicitudes de amistad!  \n");

					}
					}
				}
				if (op2 == 3) {

					printf("*(3)Enviar mensaje a un usuario del sistema *\n");
					char manssage[20];
					char receive[20];
					//char sender[20];
					struct Usuario nuevoUsuarioLocal ;
					printf("Escribe Numbre de amigo a quin queires mandar manssage\n");
					scanf("%s", receive);
					printf("Escribe un manssage\n");

					scanf("%s", manssage);

					strcpy(nuevoUsuarioLocal.lista_de_Manssage[nuevoUsuarioLocal.cont_manssage].manssage,manssage);
					strcpy(nuevoUsuarioLocal.lista_de_Manssage[nuevoUsuarioLocal.cont_manssage].receive,receive);
					strcpy(nuevoUsuarioLocal.lista_de_Manssage[nuevoUsuarioLocal.cont_manssage].sender,usuarioLocal.nickName);

					printf("uevoUsuarioLocal->lista_de_Manssage[nuevoUsuarioLocal.cont_manssage].manssage==%s \n ",nuevoUsuarioLocal.lista_de_Manssage[nuevoUsuarioLocal.cont_manssage].manssage);
					soap_call_ns__enviar_mensaje(&soap, serverURL, "",nuevoUsuarioLocal,  &res);

				}
				if (op2 == 4) {
					struct Usuario *nuevoUsuarioLocal = malloc(sizeof(struct Usuario));

										soap_call_ns__recibir_mensaje(&soap, serverURL, "",usuarioLocal,
												nuevoUsuarioLocal);

										printf("\El contador en resiver  es: %d\n",nuevoUsuarioLocal->cont_manssage);
										int i;
										for(i=0;i<=nuevoUsuarioLocal->cont_manssage;i++)
										{
											//printf("\nNuevo receive es: %s\n",nuevoUsuarioLocal->lista_de_Manssage[0].sender);
											printf("\El manassge es: %s\n",nuevoUsuarioLocal->lista_de_Manssage[i].manssage);

										}
										free(nuevoUsuarioLocal);
				}
				if (op2 == 5) {
					printf("*(5)Comprobar envio del mensaje (doubleCheck) *\n");
					soap_call_ns__comprobar_envio(&soap, serverURL, "",		nuevoUsuarioLocal, &vacio, &res);
				}
				if (op2 == 6) {
					printf("*(6)Enviar fichero a un usuario del sistema *\n");
					soap_call_ns__enviar_fichero(&soap, serverURL, "",
							nuevoUsuarioLocal, &vacio, &res);
				}
				if (op2 == 7) {
					printf("*(7)Recibir fichero a de usuarios del sistema *\n");
					soap_call_ns__recibir_fichero(&soap, serverURL, "",
							nuevoUsuarioLocal, &vacio, &res);
				}
				if (op2 == 8) {
					int val[50];
					int i;
					printf("*Usuarios Online   *\n");

					p = malloc(sizeof(struct ListaFriendShip));
					soap_call_ns__getAllSOAPServices2(&soap, serverURL, " ", p);
					for (i = 0; i <= p->iterador; i++)
						if (p->frienShip[i].sender == idUsuario)
							printf("Usuario %d %s TU MISMO!!! \n", p->frienShip[i].sender,
									p->frienShip[i].user);
						else
							printf("Usuario %d %s\n", p->frienShip[i].sender, p->frienShip[i].user);

					free(p);
				}
				if (op2 == 9) {
					printf("*(8)SALIR \n");
					sale = 1;
				}
			}
		}

	}

	// Debug?
	if (DEBUG_MODE) {
		printf("Server: %s\n", serverURL);
	}
	// Check for errors...
	if (soap.error) {
		soap_print_fault(&soap, stderr);
		exit(1);
		if (DEBUG_MODE) {
			printf("Server: %s\n", serverURL);
		}
		printf("%d", res);
		// Check for errors...
		if (soap.error) {
			soap_print_fault(&soap, stderr);
			exit(1);
		}
		printf("%d", res);
		printf("\n\n");
		// Clean the environment
		soap_destroy(&soap);
		soap_end(&soap);
		soap_done(&soap);
		return 0;
	}
}
